home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / expl / explzako.lzh / bomb.c < prev    next >
C/C++ Source or Header  |  1998-11-12  |  2KB  |  117 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <XSP2lib.H>
  4. #include "expl.h"
  5. #include "fxsp2lib.h"
  6.  
  7. #define BOMB_MAX    32    /* 最大数 */
  8.  
  9. BOMB *bomb, *bomb_top, *bomb_null_top;
  10. extern int o_option;
  11.  
  12. int bomb_init0 (void)
  13. {
  14.     int i;
  15.  
  16.     if ((bomb = malloc (sizeof (BOMB) * BOMB_MAX)) == NULL)
  17.         return (-1);
  18.  
  19.     bomb_top = NULL;
  20.     bomb_null_top = bomb;
  21.     for (i = 0; i < BOMB_MAX; i++) {
  22.         bomb[i].next = &bomb[i + 1];
  23.     }
  24.     bomb[BOMB_MAX - 1].next = NULL;
  25.  
  26.     return (0);
  27. }
  28.  
  29.  
  30. void bomb_init (signed short x, signed short y, signed int vx, signed int vy, char cyc)
  31. {
  32.     if (bomb_null_top != NULL) {
  33.         BOMB *p;
  34.  
  35.         p = bomb_null_top;
  36.         bomb_null_top = p->next;
  37.         p->next = bomb_top;
  38.         bomb_top = p;
  39.  
  40.         p->lx = x << 16;
  41.         p->ly = y << 16;
  42.         p->pt = 0;
  43.         p->info = ((rand ()% 15) << 12) | 0x013f;
  44.         p->vx = vx;
  45.         p->vy = vy;
  46.         p->cyc = cyc;
  47.         p->cyc1 = cyc;
  48.     }
  49. }
  50.  
  51.  
  52.  
  53. void bomb_move (void)
  54. {
  55.     BOMB *p, *q;
  56.  
  57.     p = bomb_top;
  58.     q = NULL;
  59.     while (p != NULL) {
  60.         char erase_flag = 0;
  61.  
  62.         /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  63.         p->x = (p->lx += p->vx) >> 16;
  64.         p->y = (p->ly += p->vy) >> 16;
  65.  
  66.         p->vx -= p->vx * 0.2;    /* 空気抵抗 */
  67.         p->vy -= p->vy * 0.2;
  68.  
  69.         if (--p->cyc1 <= 0) {
  70.             p->cyc1 = p->cyc;
  71.             if (++p->pt > 5)
  72.                 erase_flag = !0;
  73.         }
  74.         if (erase_flag) {
  75.             if (q == NULL) {    /* リストの一番最初を削除 */
  76.                 bomb_top = p->next;
  77.                 p->next = bomb_null_top;
  78.                 bomb_null_top = p;
  79.                 q = NULL;
  80.                 p = bomb_top;
  81.             } else {
  82.                 q->next = p->next;
  83.                 p->next = bomb_null_top;
  84.                 bomb_null_top = p;
  85.                 p = q->next;
  86.             }
  87.         } else {
  88.             p->x += (128 + 16);    /* 表示用に補正 */
  89.             p->y += (128 + 16);
  90.             p->x -= 8;
  91.             p->y -= 8;
  92.             xsp_set_st (p);
  93.             p->x -= (128 + 16);
  94.             p->y -= (128 + 16);
  95.             fxsp_set_st (p);
  96.             p->x += 8;
  97.             p->y += 8;
  98.             q = p;
  99.             p = p->next;
  100.         }
  101.     }
  102. }
  103.  
  104.  
  105. void bomb_tini (void)
  106. {
  107.     int i;
  108.  
  109.     bomb_top = NULL;
  110.     bomb_null_top = bomb;
  111.     for (i = 0; i < BOMB_MAX; i++) {
  112.         bomb[i].next = &bomb[i + 1];
  113.     }
  114.     bomb[BOMB_MAX - 1].next = NULL;
  115.  
  116. }
  117.